#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mapChar.h"
#include "geradorAutomato.h"

int contarTexto(char *texto) {

	int cont = 0;
	while(texto[cont] != '\0') {
		cont++;
	}
	return cont;
}

int contarAlfabeto(char *padrao, int n) {

	MapaChar m;
	criaMapaChar(&m);

	int i;
	for (i = 0; i < n; i++) {
		putCaracter(&m, padrao[i], i);
	}

	int qtdCaracteres = contarCaracteres(m);

	liberaMapaChar(m);

	return qtdCaracteres;
}


char* obterAlfabeto(char *padrao, int n) {

	MapaChar m;
	criaMapaChar(&m);

	int i;

	for(i = 0; i < n; i++) {
		putCaracter(&m,padrao[i],i);
	}

	char *palavra = palavraCaracter(m);

	liberaMapaChar(m);

	return palavra;
}

int ** alocaMatriz(int linhas, int colunas)
{
    int **matriz;
    int *aux;
    int i, j;
    matriz = (int **) malloc(sizeof(int *)*linhas);
    aux = (int *) malloc(sizeof(int)*linhas*colunas);
    for (i = 0; i < linhas; i++)
        matriz[i] = &(aux[colunas*i]);
    return matriz;
}

void liberaMatriz(int **matriz, int linhas)
{
    free(matriz);
}

int** gerarMatrizEstados(char *padrao, char *alfabeto, int linhas, int colunas) {

	int **matriz = alocaMatriz(linhas + 1, colunas + 1);
	int i,j;
	for(i = 0; i < linhas; i++) {
		for(j = 0 ; j < colunas; j++ ) {
			matriz[i][j] = 0;

			if(padrao[j] == alfabeto[i]) {
				matriz[i][j] = j + 1;
			} else if (j<colunas){

				int k=1;

				while(k<=j) {

					//obtem o padrao lido, removendo o prefixo
					char *padraoLido = (char*) malloc((j+1) - k);

					int indice,local;

					//preenche o padraoLido a partir do indice k do padrao
					for(indice=k,local=0;indice<j;indice++,local++) {
						padraoLido[local] = padrao[indice];
					}

					padraoLido[local] = alfabeto[i];

					//verifica se o subpadrão é aceito
					int sinal=1;

					for(indice=0;indice<j+1-k;indice++) {
						if(padraoLido[indice] != padrao[indice]) {
							sinal = 0;
						}
					}

					if(sinal) {
						matriz[i][j] = j-k+1;
						break;
					}
					k++;
			   }
			}
		}
	}

	return matriz;
}

void imprimirMatrizEstados(int **matriz, int linhas, int colunas) {

	int i, j;
	for (i = 0; i < linhas; i++) {
		printf("\n");
		for (j = 0; j < colunas; j++) {
			printf("%d\t",matriz[i][j]);
		}
	}

}

